package com.rongji.dfish.demo.editor.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.rongji.dfish.base.Utils;
import com.rongji.dfish.base.util.StringUtil;
import com.rongji.dfish.framework.controller.BaseController;
import com.rongji.dfish.ui.Combo;
import com.rongji.dfish.ui.Highlight;
import com.rongji.dfish.ui.helper.GridPanel;
import com.rongji.dfish.ui.layout.VerticalLayout;
import com.rongji.dfish.ui.layout.View;
import com.rongji.dfish.ui.layout.grid.GridColumn;
import com.rongji.dfish.ui.layout.grid.Tr;
import com.rongji.dfish.ui.widget.PageBar;

@Controller
@RequestMapping("/sugguestShow")
public class SugguestShowController extends BaseController{
	//{"type":"combobox","name":"searchOrg","multiple":false,"placeholder":"输入关键字搜索组织",
	//"src":"pub/orgSuggest?keyword=$text&orgId=$value&multiple=0",
	//"nobr":true,"cls":"x-bd-orgsearch","style":"margin:10px 15px;padding-right:30px;","width":"*","hmin":22,"wmin":62,
	//"pub":{"on":{"click":"pub.org.popup(this.val());"}},"label":"组织",
	//"suggest":true,"suggestsrc":"pub/orgSuggest?keyword=$text&orgId=$value&multiple=0"}
	@RequestMapping("/orgSuggest")
	@ResponseBody
	public Object orgSuggest(HttpServletRequest request) throws Exception {
		String keyword=Utils.getParameter(request,"keyword");
		String orgId=Utils.getParameter(request,"orgId");
		int matchLength=2;
		List<Object[]> dataList= null;
		if(Utils.isEmpty(orgId)){
			 dataList= search(keyword);
		}else{
			dataList= get(orgId);
		}
			View view = new View();
			
			VerticalLayout root = new VerticalLayout("root").setMinwidth(300).setCls("bg-white").setStyle("border:1px solid #CCC;").setWmin(2).setHmin(2);
			view.add(root);
			GridPanel grid = new GridPanel("grid");
			root.add(grid, "*");
			grid.setHasTableHead(false).setNobr(true).setCls("x-grid-odd x-grid-em").setFace(GridPanel.FACE_NONE).setScroll(true);
			grid.setPub(new Tr().setHeight("30"));
			
			List<Object[]> gridData = new ArrayList<Object[]>();
			if (dataList != null) {
				for (Object[] item : dataList) {
					String[] data = Arrays.copyOf(item, 4, String[].class);
					gridData.add(data);
				}
			}
			grid.setCombo(new Combo().setField(new Combo.Field("v", "n")));
			grid.setLimit(10);
			
			grid.setGridData(gridData);
			int columnIndex = 0;
			grid.addColumn(GridColumn.hidden(columnIndex++, "v"));
			grid.addColumn(GridColumn.text(columnIndex++, "n", "名称", "60%").setTipfield("n").setHighlight(new Highlight(keyword, matchLength)));
			grid.addColumn(GridColumn.text(columnIndex++, "sn", "产值", "40%").setTipfield("sn").setStyle("color:green").setAlign(GridColumn.ALIGN_RIGHT));
//			grid.addColumn(GridColumn.hidden(columnIndex++, "fn"));
			
			PageBar page = new PageBar("page", PageBar.TYPE_MINI);
			page.setTarget("grid").setAlign(PageBar.ALIGN_RIGHT);
			page.setBtncount(5);
			root.add(page,"30");
			
			return view;
		}

	private List<Object[]> get(String orgId) {
		List<Object[]> result=new ArrayList<Object[]>();
		if(data==null){
			loadData();
		}
		if(Utils.isEmpty(orgId)){
			return result;
		}
		String[] vs=orgId.split(",");
		for(String v:vs){
			result.add(data.get(v));
		}
		return result;
	}

	private List<Object[]> search(String keyword) {
		List<Object[]> result=new ArrayList<Object[]>();
		if(data==null){
			loadData();
		}
		if(Utils.isEmpty(keyword)){
			return result;
		}
		List<String> rawWords =WordSplitter.getInstance().splitWords(keyword);
		List<String> words=new ArrayList<String>();
		words.addAll(rawWords);
		for(int i=0;i<rawWords.size()-1;i++){
			words.add(rawWords.get(i)+rawWords.get(i+1));
		}
		//要把所有数据的相似度累加。类似于数据库的groupBy动作。
		Map<String,Long> sugValue=new HashMap<String,Long>();
		for(String w:words){
			Map<String,Long>partValue=sugg_value.get(w);
			if(partValue==null){
				continue;
			}
			for(Map.Entry<String, Long>entry:partValue.entrySet()){
				Long l=sugValue.get(entry.getKey());
				if(l==null){
					sugValue.put(entry.getKey(), entry.getValue());
				}else{
					sugValue.put(entry.getKey(), entry.getValue()+l);
				}
			}
		}
		List<Object[]> groupByed=new ArrayList<Object[]>(sugValue.size());
		for(Map.Entry<String, Long>entry:sugValue.entrySet()){
			groupByed.add(new Object[]{entry.getKey(),entry.getValue()});
		}
		Collections.sort(groupByed,new java.util.Comparator<Object[]>(){
			@Override
			public int compare(Object[] o1, Object[] o2) {
				Long l1=(Long) o1[1];
				Long l2=(Long) o2[1];
				return l2>l1?1:(l2==l1?0:-1);
			}
		});
		if(groupByed.size()>30){
			groupByed=groupByed.subList(0, 30);
		}
		for(Object[] o:groupByed){
			result.add(data.get(o[0]));
		}
		return result;
	}


//	private  Map<String,String[]>
	
	private void loadData() {
		data=new HashMap<String,String[]>(RAW_DATA.length);
		for(int i=0;i<RAW_DATA.length;i++){
			String id="000"+(i+1);
			id=id.substring(id.length()-3);
			String line=RAW_DATA[i];
			int index=line.indexOf("公司");
			String name=line.substring(0,index+2);
			String product=line.substring(index+2)+"万";
			data.put(id,new String[]{id,name,product});
		}
		sugg_value=new HashMap<String, Map<String,Long>>();
		for(String[] row:data.values()){
			String text=row[1];
			String id=row[0];
			long suggValue = 1000L;
//			final HashMap<String,Long> keyWords=new HashMap<String,Long>();	
				long suggValue1=(long)(suggValue/Math.sqrt((double)text.length()));
				for(int i=0;i<text.length();i++){
					String keyWord=text.substring(i,i+1);
					setSuggValue(keyWord,id,suggValue1,sugg_value);
					String pinyin=StringUtil.getPinyinFullShortFormat(keyWord, false)[0];
					pinyin=pinyin.replace("u:", "v");
					setSuggValue(pinyin,id,suggValue1,sugg_value);
				}
			//每两个字的value计算 //相同的字积分直接加倍
			long suggValue2=(long)(suggValue/Math.sqrt(((double)text.length())/2));
			for(int i=0;i<text.length()-1;i++){
				String keyWord=text.substring(i,i+2);
				setSuggValue(keyWord,id,suggValue2,sugg_value);
				String pinyin=StringUtil.getPinyinFullShortFormat(keyWord, false)[0];
				pinyin=pinyin.replace("u:", "v");
				setSuggValue(pinyin,id,suggValue2,sugg_value);
			}
		}
	}
	
	private void setSuggValue(String key, String id, long suggValue, Map<String, Map<String, Long>> sugg_value) {
		Map<String, Long> secondIndex=sugg_value.get(key);
		if(secondIndex==null){
			secondIndex=new HashMap<String,Long>();
			sugg_value.put(key, secondIndex);
		}
		secondIndex.put(id, suggValue);
	}

	//相当于数据库主键索引
	private static Map<String,String[]> data;
	//相当于数据库双值主键
	private static Map<String,Map<String,Long>> sugg_value;
	
	private static final String[] RAW_DATA={
		"华为技术有限公司17861603",
		"中兴通讯股份有限公司4600000",
		"海尔集团公司4122240",
		"浪潮集团有限公司1615323",
		"海信集团有限公司1128593",
		"南京南瑞集团公司1051215",
		"杭州海康威视数字技术股份有限公司1016933",
		"中国银联股份有限公司924136",
		"株洲南车时代电气股份有限公司921335",
		"航天信息股份有限公司913412",
		"浙江大华技术股份有限公司755837",
		"同方股份有限公司700372",
		"熊猫电子集团有限公司689509",
		"金山软件有限公司567611",
		"东华软件股份公司562014",
		"上海华东电脑股份有限公司542363",
		"江苏集群信息产业股份有限公司521143",
		"北京中软国际信息技术有限公司515709",
		"武汉邮电科学研究院514446",
		"浙大网新科技股份有限公司501283",
		"文思海辉技术有限公司490662",
		"深圳市华讯方舟科技有限公司489531",
		"东软集团股份有限公司487700",
		"软通动力信息技术（集团）有限公司476019",
		"亚信科技（中国）有限公司474037",
		"福州福大自动化科技有限公司471056",
		"江苏省通信服务有限公司457181",
		"国电南京自动化股份有限公司427741",
		"大唐电信科技股份有限公司426066",
		"广州佳都集团有限公司421653",
		"上海宝信软件股份有限公司392958",
		"北京小米移动软件有限公司386793",
		"太极计算机股份有限公司378327",
		"上海华讯网络系统有限公司373628",
		"中国软件与技术服务股份有限公司360160",
		"神州数码系统集成服务有限公司348136",
		"北京全路通信信号研究设计院集团有限公司338128",
		"大族激光科技产业集团股份有限公司336714",
		"中科软科技股份有限公司327828",
		"中国民航信息网络股份有限公司318107",
		"中国电子科技网络信息安全有限公司310435",
		"福建星网锐捷通讯股份有限公司301100",
		"用友网络科技股份有限公司296598",
		"广州广电运通金融电子股份有限公司291857",
		"四川省通信产业服务有限公司291218",
		"上海贝尔软件有限公司281532",
		"阿里云计算有限公司273484",
		"石化盈科信息技术有限责任公司268077",
		"北京神州泰岳软件股份有限公司264654",
		"深圳市金证科技股份有限公司258565",
		"北京中电普华信息技术有限公司255798",
		"北京京东尚科信息技术有限公司251681",
		"中控科技集团有限公司241786",
		"科大讯飞股份有限公司239331",
		"深圳市欧珀通信软件有限公司239114",
		"广州海格通信集团股份有限公司238348",
		"四川九洲电器集团有限责任公司233097",
		"北京中油瑞飞信息技术有限责任公司220172",
		"信雅达系统工程股份有限公司219126",
		"国网通信亿力电力科技股份有限公司209972",
		"卡斯柯信号有限公司207638",
		"东方电子集团有限公司207333",
		"银江股份有限公司204594",
		"北京华胜天成科技股份有限公司202451",
		"新大陆科技集团有限公司199653",
		"平安科技（深圳）有限公司198138",
		"东莞市步步高通信软件有限公司197269",
		"深圳创维数字技术有限公司195379",
		"中冶赛迪集团有限公司193854",
		"山东中创软件工程股份有限公司192613",
		"恒生电子股份有限公司190307",
		"万达信息股份有限公司186525",
		"江苏金智集团有限公司185310",
		"高德信息技术有限公司172220",
		"博彦科技股份有限公司171809",
		"深圳怡化电脑股份有限公司170723",
		"先锋软件股份有限公司170603",
		"深圳天源迪科信息技术股份有限公司167740",
		"深圳市大疆创新科技有限公司164967",
		"金蝶软件（中国）有限公司161497",
		"南京联创科技集团股份有限公司160607",
		"北明软件有限公司160087",
		"恒宝股份有限公司158924",
		"广联达软件股份有限公司153943",
		"天津天地伟业数码科技有限公司152248",
		"云南南天电子信息产业股份有限公司152132",
		"启明星辰信息技术集团股份有限公司151411",
		"北京四方继保自动化股份有限公司151383",
		"北京四维图新科技股份有限公司150615",
		"北京宇信科技集团股份有限公司146778",
		"江苏润和科技投资集团有限公司146215",
		"北大方正集团有限公司144628",
		"博雅软件股份有限公司141722",
		"启明信息技术股份有限公司138374",
		"江苏国光信息产业股份有限公司135597",
		"广州杰赛科技股份有限公司135582",
		"北京华宇软件股份有限公司135167",
		"武汉天喻信息产业股份有限公司134719",
		"大连华信计算机技术股份有限公司133415",
		"北京易华录信息技术股份有限公司133355"
	};
}
